/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.eventos.beans;

import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.eventos.bc.CursoAdapter;
import org.cip.esymons.eventos.bc.CursoDelegate;
import org.cip.esymons.eventos.bc.InstructorEventoDelegate;
import org.cip.esymons.eventos.bc.InstructorEventoAdapter;
import org.cip.esymons.eventos.bc.InstructorModuloDelegate;
import org.cip.esymons.eventos.bc.ModuloCursoDelegate;
import org.cip.esymons.eventos.bc.PreEventoDelegate;
import org.cip.esymons.eventos.be.InstructorEvento;
import org.cip.esymons.eventos.be.InstructorModulo;
import org.cip.esymons.eventos.be.ModuloCurso;
import org.cip.esymons.eventos.be.Preevento;
import org.cip.esymons.general.bc.PersonaNaturalDelegate;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.util.Utiles;


/**
 *
 * @author lizardo
 */
public class InstructorEventoController {
    private InstructorEventoDelegate delegado;
    private CursoDelegate delegadoCurso;
    private InstructorEventoAdapter instructorEventoAdapter;
    private InstructorEvento instructorEvento;
    private InstructorModulo instructorModulo;
    List<InstructorEventoAdapter> listaInstructorEvento;
    List<InstructorEvento> listaInstructorCurso;
    List<PersonaNatural> listaInstructor;
    List<ModuloCurso> listaModuloCurso;
    List<InstructorModulo> listaInstructorModulo;
    private Integer curCodigo;
    private Long perCodigo;
    private String mensaje;
    private Integer opcion;
    private String numero;
    private String instructor;
    private Integer preCodigo;
    private Integer ineCodigo;
    private Integer modCodigo;
    private CursoAdapter cursoAdapter;


    /*********************** Constructor de la clase *************************/
    public InstructorEventoController() {
        inicializar();
    }

    /*************************** Sets y Gettters *****************************/
    public InstructorEventoAdapter getInstructorEventoAdapter() {
        return instructorEventoAdapter;
    }
    public void setInstructorEventoAdapter(InstructorEventoAdapter instructorEventoAdapter) {
        this.instructorEventoAdapter = instructorEventoAdapter;
    }

    public List<InstructorEventoAdapter> getListaInstructorEvento() {
        return listaInstructorEvento;
    }
    public void setListaInstructorEvento(List<InstructorEventoAdapter> listaInstructorEvento) {
        this.listaInstructorEvento = listaInstructorEvento;
    }

    public InstructorEventoDelegate getDelegado() {
        return delegado;
    }

    public CursoAdapter getCursoAdapter() {
//        if (cursoAdapter != null) {
//            curCodigo = cursoAdapter.getCodigo();
//            listarInstructorCurso();
//        }
        return cursoAdapter;
    }

    public void setCursoAdapter(CursoAdapter cursoAdapter) {
        this.cursoAdapter = cursoAdapter;
    }



    public String getMensaje() {
        return mensaje;
    }
    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

    public Integer getOpcion() {
        return opcion;
    }
    public void setOpcion(Integer opcion) {
        this.opcion = opcion;
    }

    public String getNumero() {
        return numero;
    }
    public void setNumero(String numero) {
        this.numero = numero;
    }

    public String getInstructor() {
        return instructor;
    }
    public void setInstructor(String instructor) {
        this.instructor = instructor;
    }

    public CursoDelegate getDelegadoCurso() {
        return delegadoCurso;
    }
    public void setDelegadoCurso(CursoDelegate delegadoCurso) {
        this.delegadoCurso = delegadoCurso;
    }

    public String agregarInstructores() {
        if (cursoAdapter != null) {
            curCodigo = cursoAdapter.getCodigo();
            listarInstructorCurso();
        }
        return "nuevo_instructor";
    }

    public Integer getCurCodigo() {
//        if (cursoAdapter != null) {
//            curCodigo = cursoAdapter.getCodigo();
//            listarInstructorCurso();
//        }
        return curCodigo;
    }
    public void setCurCodigo(Integer curCodigo) {
        this.curCodigo = curCodigo;
    }

    public List<PersonaNatural> getListaInstructor() {
        return listaInstructor;
    }
    public void setListaInstructor(List<PersonaNatural> listaInstructor) {
        this.listaInstructor = listaInstructor;
    }

    public Long getPerCodigo() {
        return perCodigo;
    }
    public void setPerCodigo(Long perCodigo) {
        this.perCodigo = perCodigo;
    }

    public InstructorEvento getInstructorEvento() {
        return instructorEvento;
    }
    public void setInstructorEvento(InstructorEvento instructorEvento) {
        this.instructorEvento = instructorEvento;
    }

    public List<InstructorEvento> getListaInstructorCurso() {
        return listaInstructorCurso;
    }
    public void setListaInstructorCurso(List<InstructorEvento> listaInstructorCurso) {
        this.listaInstructorCurso = listaInstructorCurso;
    }

    public List<InstructorModulo> getListaInstructorModulo() {
        return listaInstructorModulo;
    }
    public void setListaInstructorModulo(List<InstructorModulo> listaInstructorModulo) {
        this.listaInstructorModulo = listaInstructorModulo;
    }

    public Integer getModCodigo() {
        return modCodigo;
    }

    public void setModCodigo(Integer modCodigo) {
        this.modCodigo = modCodigo;
    }

    public Integer getPreCodigo() {
        return preCodigo;
    }

    public void setPreCodigo(Integer preCodigo) {
        this.preCodigo = preCodigo;
    }

    public List<ModuloCurso> getListaModuloCurso() {
        return listaModuloCurso;
    }

    public void setListaModuloCurso(List<ModuloCurso> listaModuloCurso) {
        this.listaModuloCurso = listaModuloCurso;
    }

    public InstructorModulo getInstructorModulo() {
        return instructorModulo;
    }

    public void setInstructorModulo(InstructorModulo instructorModulo) {
        this.instructorModulo = instructorModulo;
    }

    public Integer getIneCodigo() {
        return ineCodigo;
    }

    public void setIneCodigo(Integer ineCodigo) {
        this.ineCodigo = ineCodigo;
    }



    /**************************** Metodos ************************************/
    public String inicializar() {
        delegado = new InstructorEventoDelegate();
        delegadoCurso = new CursoDelegate();
        instructorEvento = new InstructorEvento();
        instructorModulo = new InstructorModulo();
        listaInstructorEvento = new ArrayList<InstructorEventoAdapter>();
        listaInstructor = new ArrayList<PersonaNatural>();
        listaInstructorCurso = new ArrayList<InstructorEvento>();
        listar();
        mostrarFirmaInstructor();
        return "";
    }

    public String mostrarFirmaInstructor() {
        try {
            mensaje = "";
            InstructorEvento ie = new InstructorEvento();
            preCodigo = (preCodigo != null) ? preCodigo : 0;
            ie = delegado.mostrarFirmaInstructor(preCodigo);
            if (ie != null)
                mensaje = "El instructor: " + ie.getPerCodigo().getNombreCompleto() + " tiene la prioridad de firmar los certificados en todos los modulos del preevento.";
            else
                mensaje = "Ningún instructor tiene la prioridad de firmar certificados en todos los modulos del preevento!";
            ie = null;
        } catch (Exception ex) {
            mostrarMensaje("Error: ", "No se puede mostrar firma del instructor! " + ex.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return null;
    }

    public String asignar() {
        try {
            PersonaNatural persona = new PersonaNatural();
            Preevento preevento = new Preevento();
            PersonaNaturalDelegate delegadoPersona = new PersonaNaturalDelegate();
            PreEventoDelegate delegadoPreevento = new PreEventoDelegate();

            perCodigo  = (perCodigo == null) ? 0 : perCodigo;
            curCodigo  = (curCodigo == null) ? 0 : curCodigo;
            persona = delegadoPersona.buscarxId(perCodigo);
            preevento = delegadoPreevento.findID(curCodigo);

            instructorEvento.setInePrioridad(false);
            instructorEvento.setPerCodigo(persona);
            instructorEvento.setPreCodigo(preevento);
            delegado.registrar(instructorEvento);
            instructorEvento = new InstructorEvento();
            persona = null;
            preevento = null;
            delegadoPersona = null;
            delegadoPreevento = null;
            inicializar();
        } catch (Exception ex) {
            mostrarMensaje("Error: ", "No se puede asignar al instructor! " + ex.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return listarInstructorCurso();
    }

    public String buscar() {
        PersonaNaturalDelegate delegadoPersona = new PersonaNaturalDelegate();
        try {
            if (opcion == 1) {
                Colegiado colegiado = new Colegiado();
                numero = Utiles.rellenarCeros(numero, 6);
                colegiado = delegadoPersona.buscarPersonaXNroCip(numero);
                perCodigo = (colegiado != null) ? colegiado.getSolCodigo() : 0;
                System.out.println("persona: " + colegiado.getPersonaNatural());
                instructor = (colegiado != null) ? colegiado.getPersonaNatural().getNombreCompleto() : "--No se encuentra al instructor--";
                colegiado = null;
            } else {
                PersonaNatural persona = new PersonaNatural();
                persona = delegadoPersona.buscarPersonaXDni(numero);
                System.out.println("PERSONA: " + persona);
                if (persona != null) {
                    perCodigo = persona.getSolCodigo();
                    instructor = persona.getNombreCompleto();
                    persona = null;
                } else {
                    perCodigo = new Long(0);
                    instructor = "--No se encuentra al instructor--";
                }
            }            
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se puede buscar al instructor! ", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        delegadoPersona = null;
        return listarInstructorCurso();
    }

    public String buscarInstructorModulo() {
        try {
            InstructorModuloDelegate delegadoInstructorModulo = new InstructorModuloDelegate();
            listaInstructorModulo = delegadoInstructorModulo.listarInstructorModulo(preCodigo, modCodigo);
            delegadoInstructorModulo = null;
        } catch (Exception ex) {
            mostrarMensaje("Error: ", "No se puede buscar los modulos del instructor! " + ex.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return mostrarFirmaInstructor();
    }

    public String limpiar() {
        opcion = 0;
        numero = "";
        instructor = "";
        return null;
    }

    public String listar() {
        try {
            listaInstructorEvento = delegado.listarInstructorEvento(curCodigo);
        } catch (Exception ex) {
            mostrarMensaje("Error: ", "No se puede listar a los instructores! ", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        
        return "listar";
    }

    public String listarInstructorCurso() {
        try {
            curCodigo  = (curCodigo == null) ? 0 : curCodigo;
            listaInstructorCurso = delegado.listarPorCurso(curCodigo);
        } catch (Exception ex) {
            mostrarMensaje("Error: ", "No se puede listar a los instructores! ", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        listaInstructorCurso = delegado.listarPorCurso(curCodigo);
        return null;
    }

    public InstructorEventoAdapter buscarPorCodigo(Integer codigo) {
        return delegado.buscarPorCodigo(codigo);
    }

    public String buscarModulos() {
        try {
            preCodigo = (preCodigo != null) ? preCodigo : 0;
//            ModuloCursoDelegate delegadoModuloCurso = new ModuloCursoDelegate();
//            listaModuloCurso = delegadoModuloCurso.listarModuloXPreevento(preCodigo);
//            delegadoModuloCurso = null;
        } catch (Exception ex) {
            mostrarMensaje("Error: ", "No se puede buscar los modulos! ", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String quitar() {
        try {
            delegado.eliminar(instructorEvento);
        } catch (Exception ex) {
            mostrarMensaje("Error: ", "No se puede eliminar al instructor! " + ex.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return listarInstructorCurso();
    }

    public String registrarInstructor() {
        try {
            InstructorModuloDelegate delegadoInstructorModulo = new InstructorModuloDelegate();
            InstructorEventoDelegate delegadoInstructorEvento = new InstructorEventoDelegate();
            for (InstructorModulo im : listaInstructorModulo) {
                InstructorEvento ie = new InstructorEvento();
                ie = im.getIneCodigo();
                delegadoInstructorEvento.actualizar(ie);
                delegadoInstructorModulo.edit(im);
                ie = null;
            }
            modCodigo = (modCodigo == null) ? 0 : modCodigo;
            listaInstructorModulo = delegadoInstructorModulo.mostrarInstructorModulo(modCodigo);
            delegadoInstructorEvento = null;
            delegadoInstructorModulo = null;
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se puede agregar instructor. " + ex.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return null;
    }

    public String priorizarFirmas() {
        try {
            InstructorModuloDelegate delegadoInstructorModulo = new InstructorModuloDelegate();
            preCodigo = (preCodigo == null) ? 0 : preCodigo;
            modCodigo = (modCodigo == null) ? 0 : modCodigo;
            if (instructorModulo != null) {
                ineCodigo = instructorModulo.getIneCodigo().getIneCodigo();
                ineCodigo = (ineCodigo == null) ? 0 : ineCodigo;
                listaInstructorModulo = delegadoInstructorModulo.priorizarFirmas(preCodigo, ineCodigo, modCodigo);
            }
            delegadoInstructorModulo = null;
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "No se pudo  priorizar la firma. " + ex.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return mostrarFirmaInstructor();
    }

    public SelectItem[] getComboPreEvento() {
        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            PreEventoDelegate delegadoPreevento = new PreEventoDelegate();
            List<Preevento> listaPreEvento = delegadoPreevento.listarPreeventosActivos();
            System.out.println("tamaño: " + listaPreEvento.size());
            selects = new SelectItem[listaPreEvento.size()];
            int cont = 0;
            for (Preevento preevento : listaPreEvento) {
                SelectItem item = new SelectItem(preevento.getPreCodigo(), preevento.getPreNombre());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen pre-eventos");
            selects[0] = item;
            return selects;
        }
    }

    public SelectItem[] getComboCursos() {
        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            List<Preevento> listaEventos = delegadoCurso.listarCursosEnProceso();
            selects = new SelectItem[listaEventos.size()];
            int cont = 0;
            for (Preevento preevento : listaEventos) {
                SelectItem item = new SelectItem(preevento.getPreCodigo(), preevento.getPreNombre());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen cursos");
            selects[0] = item;
            return selects;
        }
    }

    public SelectItem[] getComboInstructores() {
        try {
            PersonaNaturalDelegate delegadoPersona = new PersonaNaturalDelegate();
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            List<PersonaNatural> listaInstructores = delegadoPersona.listarPersonas();
            delegadoPersona = null;
            selects = new SelectItem[listaInstructores.size()];
            int cont = 0;
            for (PersonaNatural persona : listaInstructores) {
                SelectItem item = new SelectItem(persona.getSolCodigo(), persona.getNombreCompleto());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen instructores del curso");
            selects[0] = item;
            return selects;
        }
    }

    public SelectItem[] getComboModulos() {
        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            //curCodigo = 3; //borrar esta linea
            ModuloCursoDelegate delegadoModuloCurso = new ModuloCursoDelegate();
            preCodigo = (preCodigo == null) ? 0 : preCodigo;
            //List<ModuloCurso> listaModulos = delegadoModuloCurso.listarModuloXPreevento(preCodigo);
            List<ModuloCurso> listaModulos = delegadoModuloCurso.listarModulo(preCodigo);
            delegadoModuloCurso = null;
            selects = new SelectItem[listaModulos.size()];
            int cont = 0;
            for (ModuloCurso modulos : listaModulos) {
                SelectItem item = new SelectItem(modulos.getModCodigo(), modulos.getModNombre());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen modulos");
            selects[0] = item;
            return selects;
        }
    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }
    
}
